#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=10000;
int w[maxn];
int n,W,pre[maxn];
bool x[maxn];

void dfs(int id,int curw){
    if(curw==W){
        for(int i=1;i<=n;i++){
            if(x[i])cout<<w[i]<<" ";
        }
        cout<<endl;
        return ;
    }
    if(id>n)return ;
    if(curw+w[id]<=W){//目前选择的数的w总和加上此数的w后未超过W，可以选择此数
        x[id]=true;
        dfs(id+1,curw+w[id]);
        x[id]=false;
    }
    //不选择此数时，判断剩余的数还够不够W-curw
    if(pre[n]-pre[id]+curw>=W){
        dfs(id+1,curw);
    }
    return ;
}

int main()
{
    memset(x,false,sizeof(x));
    cin>>n>>W;
    pre[0]=0;
    for(int i=1;i<=n;i++){
        cin>>w[i];
        pre[i]=w[i]+pre[i-1];
    }
    cout<<"子集情况有如下几种:"<<endl;
    dfs(1,0);
    getchar();
    getchar();
    return 0;
}
